class Myinit:

    def __init__(self, *args, **kwargs):

        print('===>Myinit.__init__')
        print(f'===>init傳入的*args:{args}')
        print(f'===>init傳入的kwargs:{kwargs}')
        self.name = args[0]
        self.age = args[1]
        # super().__init__() 这一行看着是无所谓

    # #初始化会先进这里，优先级高于__init__
    def __new__(cls, *args, **kwargs):
        print('===>Myinit.__new__')
        print(f'===>new傳入的*args:{args}')
        print(f'===>new傳入的kwargs:{kwargs}')
        return super().__new__(cls)  #如果返回了这个，会继续走到__init__，如果没有这一行，就没有__init__() 的事了

    ## 只有实例化对象调用才会走这里 ，如果下面没有~~~my('实例化之后的名字', 192,name="可以傳入的參數")~~~。这里就不会走
    def __call__(self, *args, **kwargs):
        print('===>Myinit.__call__')
        name = self.name
        age = self.age
        print(f'===>__call__里获取init的name:{name}')
        print(f'===>__call__里获取init的age:{age}')
        print(f'===>初始化之后實例化對象傳入的*args:{args}')
        print(f'===>初始化之后實例化對象傳入的kwargs:{kwargs}')


if __name__ == '__main__':
   my = Myinit('初始化的名字', 19,'fdddddddd') #这里面相传什么传什么
   # my('实例化之后的名字', 192,name="可以傳入的參數") #这里面相传什么传什么


# ~~~
# 结果:
# ===>Myinit.__new__
# ===>new傳入的*args:('初始化的名字', 19, 'fdddddddd')
# ===>new傳入的kwargs:{}
# ===>Myinit.__init__
# ===>init傳入的*args:('初始化的名字', 19, 'fdddddddd')
# ===>init傳入的kwargs:{}
# ===>Myinit.__call__
# ===>__call__里获取init的name:初始化的名字
# ===>__call__里获取init的age:19
# ===>初始化之后實例化對象傳入的*args:('实例化之后的名字', 192)
# ===>初始化之后實例化對象傳入的kwargs:{'name': '可以傳入的參數'}
# ~~~
